home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / games / otoko / source.lzh / FuncEnemy / lboss04w.c < prev    next >
C/C++ Source or Header  |  1999-06-14  |  8KB  |  253 lines

  1. /* 4面ボス左右翼 (04w = 04 wing) */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../otoko.h"
  5. #include "../player.h"
  6. #include "../enemy.h"
  7. #include "../eshot.h"
  8. #include "../effect.h"
  9. #include "../priority.h"
  10. #include "../sound.h"
  11. #include "../psearch.h"
  12.  
  13.  
  14. #define TIMER_1    9000        /* これ以上時間が経過したら自爆 */
  15.  
  16. enum {
  17.     WING_LEFT = 0, WING_RIGHT
  18. };
  19.  
  20. static short EnemyMoveLBoss04W (ENEMY *);
  21. static void EnemyTiniLBoss04W (ENEMY *);
  22.  
  23.  
  24. void EnemyInitLBoss04W (ENEMY * p)
  25. {
  26.     p->vx = 0;
  27.     p->vy = 2 << 16;
  28.     p->hit_px = 48;
  29.     p->hit_py = 12;
  30.     p->hit_sx = 48;
  31.     p->hit_sy = 12;
  32.     p->hit_cx = 6;
  33.     p->timer = 0;
  34.     p->damage = 0;
  35.     p->flash = 0;
  36.     p->seq = 0;
  37.     p->m_work = 0;
  38.     p->s_work = p->s_work2 = p->s_work3 = 0;
  39.     p->func_enemy_move = EnemyMoveLBoss04W;
  40.     p->func_enemy_tini = EnemyTiniLBoss04W;
  41.  
  42.     if (p->lx < 0) {
  43.         p->cwork = WING_LEFT;    /* 左か右か */
  44.         p->pt = obj_lboss04 + 3;
  45.         p->hp = 4200;    /* 実は左の方がちょっと弱い */
  46.     } else {
  47.         p->cwork = WING_RIGHT;
  48.         p->pt = obj_lboss04 + 4;
  49.         p->hp = 4500;
  50.     }
  51. }
  52.  
  53.  
  54.  
  55. static short EnemyMoveLBoss04W (ENEMY * p)
  56. {
  57.     if ((p->child_kill) || (p->child_death))
  58.         return (-1);    /* 消去 */
  59.     p->timer++;
  60.     if (p->timer > TIMER_1){
  61.         EffectInit (EFFECT_EXPL, 0, p->x, p->y);
  62.         SoundSetSE (SE_EXPL_M);    /* 中ボス爆発音 */
  63.         p->child_death = !0;    /* 消去準備 */
  64.     }
  65.  
  66.     if (p->cwork == WING_LEFT) {
  67.         p->x = p->parent->x - 31;
  68.         p->y = p->parent->y + 16;
  69.     } else {
  70.         p->x = p->parent->x + 31;
  71.         p->y = p->parent->y + 16;
  72.     }
  73.  
  74.     /* p->s_work は lboss04.c が ++ する */
  75.     switch (p->s_work) {
  76.  
  77.     case 0:        /* なぎ倒し弾 */
  78.         p->s_work2++;
  79. #define INTERVAL0    4
  80. #define SPEED_SHOT0_0    16    /* 遅いなぎ倒し弾の速度 */
  81. #define SPEED_SHOT0_1    24    /* 速い   〃     */
  82.         if (p->s_work2 > INTERVAL0) {
  83.             p->s_work2 = 0;
  84.             p->s_work3++;
  85.             if (p->s_work3 == 1) {
  86.                 if (p->cwork == WING_LEFT) {
  87.                     p->s_angle = 64 + 96;
  88.                     p->s_angle2 = 64 + 32;
  89.                 } else {
  90.                     p->s_angle = 64 - 96;
  91.                     p->s_angle2 = 64 - 32;
  92.                 }
  93.             }
  94.             /* 下に降りてきている時は攻撃を一切しない */
  95.             if (p->parent->parent->m_work < 11) {
  96.                 if (p->s_work3 < 28) {
  97.                     if (p->cwork == WING_LEFT) {
  98.                         EshotInit (ESHOT_NRG02, p->x + 32 - 8, p->y + 16 - 8, SPEED_SHOT0_0, p->s_angle, 2);
  99.                         p->s_angle -= 5;
  100.                     } else {
  101.                         EshotInit (ESHOT_NRG02, p->x - 32 + 8, p->y + 16 - 8, SPEED_SHOT0_0, p->s_angle, 2);
  102.                         p->s_angle += 5;
  103.                     }
  104.                     SoundSetSE (SE_ESHOT);    /* 敵ショット音 */
  105.                 }
  106.                 if ((p->s_work3 > 8)&&(p->s_work3 < 16)) {
  107.                     if (p->cwork == WING_LEFT) {
  108.                         EshotInit (ESHOT_NRG24N, p->x + 32 - 8, p->y + 16 - 8, SPEED_SHOT0_1, p->s_angle2, 2);
  109.                         p->s_angle2 -= 8;
  110.                     } else {
  111.                         EshotInit (ESHOT_NRG24N, p->x - 32 + 8, p->y + 16 - 8, SPEED_SHOT0_1, p->s_angle2, 2);
  112.                         p->s_angle2 += 8;
  113.                     }
  114.                     SoundSetSE (SE_ESHOT_M);    /* 敵ショット音 */
  115.                 }
  116.             }
  117.             if (p->s_work3 >= 32)
  118.                 p->s_work3 = 0;
  119.         }
  120.         break;
  121.  
  122.     case 1:        /* 直線弾 */
  123.         p->s_work2++;
  124.         switch (p->s_work2) {
  125. #define INTERVAL1    12
  126. #define SPEED_SHOT1_0    20    /* 天帝ショット速度 */
  127. #define SPEED_SHOT1_1    16    /* 直線弾速度 */
  128.         case 8 + INTERVAL1 * 0:
  129.             p->s_angle = psearch (p->x, p->y);    /* 自機の方向をサーチ */
  130.         case 8 + INTERVAL1 * 1:
  131.         case 8 + INTERVAL1 * 2:
  132.         case 8 + INTERVAL1 * 3:
  133.         case 8 + INTERVAL1 * 4:
  134.         case 8 + INTERVAL1 * 5:
  135.             /* 下に降りてきている時は攻撃を一切しない */
  136.             if (p->parent->parent->m_work < 11) {
  137.                 if (p->cwork == WING_LEFT) {
  138.                     EshotInit (ESHOT_NRG03, p->x + 32 - 8, p->y + 16 - 8, SPEED_SHOT1_0 + 0, p->s_angle - 8 * 2, 2);
  139.                     EshotInit (ESHOT_NRG04, p->x + 16 - 8, p->y + 16 - 4, SPEED_SHOT1_0 + 2, p->s_angle - 8 * 1, 2);
  140.                     EshotInit (ESHOT_NRG05, p->x + 0 - 8, p->y + 16 + 0, SPEED_SHOT1_0 + 4, p->s_angle + 8 * 0, 2);
  141.                     EshotInit (ESHOT_NRG06, p->x - 16 - 8, p->y + 16 + 4, SPEED_SHOT1_0 + 6, p->s_angle + 8 * 1, 2);
  142.                 } else {
  143.                     EshotInit (ESHOT_NRG03, p->x - 32 + 8, p->y + 16 - 8, SPEED_SHOT1_0 + 0, p->s_angle + 8 * 2, 2);
  144.                     EshotInit (ESHOT_NRG04, p->x - 16 + 8, p->y + 16 - 4, SPEED_SHOT1_0 + 2, p->s_angle + 8 * 1, 2);
  145.                     EshotInit (ESHOT_NRG05, p->x + 0 + 8, p->y + 16 + 0, SPEED_SHOT1_0 + 4, p->s_angle + 8 * 0, 2);
  146.                     EshotInit (ESHOT_NRG06, p->x + 16 + 8, p->y + 16 + 4, SPEED_SHOT1_0 + 6, p->s_angle - 8 * 1, 2);
  147.                 }
  148.                 SoundSetSE (SE_ESHOT);    /* 敵ショット音 */
  149.             }
  150.             break;
  151.         case 8 + INTERVAL1 * 7:
  152.         case 8 + INTERVAL1 * 8:
  153.         case 8 + INTERVAL1 * 9:
  154.             /* 下に降りてきている時は攻撃を一切しない */
  155.             if (p->parent->parent->m_work < 11) {
  156.                 p->s_angle = psearch (p->x, p->y);    /* 自機の方向をサーチ */
  157.                 if (p->cwork == WING_LEFT) {
  158.                     EshotInit (ESHOT_NRG24N, p->x - 8, p->y + 16, SPEED_SHOT1_1, p->s_angle, 2);
  159.                 } else {
  160.                     EshotInit (ESHOT_NRG24N, p->x + 8, p->y + 16, SPEED_SHOT1_1, p->s_angle, 2);
  161.                 }
  162.                 SoundSetSE (SE_ESHOT_M);    /* 敵ショット音(中) */
  163.             }
  164.             break;
  165.         case 8 + INTERVAL1 * 10:
  166.             p->s_work2 = 0;
  167.             break;
  168.         default:
  169.             break;
  170.         }
  171.         break;
  172.     case 2:        /* 2列直線弾 */
  173.         p->s_work2++;
  174. #define INTERVAL2    25
  175. #define SPEED_SHOT2_1    10
  176.         switch (p->s_work2) {
  177.         case 8 + INTERVAL2 * 0:
  178.         case 8 + INTERVAL2 * 1:
  179.         case 8 + INTERVAL2 * 2:
  180.         case 8 + INTERVAL2 * 3:
  181.         case 8 + INTERVAL2 * 4:
  182.         case 8 + INTERVAL2 * 5:
  183.             /* 下に降りてきている時は攻撃を一切しない */
  184.             if (p->parent->parent->m_work < 11) {
  185.                 if (p->cwork == WING_LEFT) {
  186.                     EshotInit (ESHOT_NRG22, p->x + 80 - 8, p->y + 16 - 16, SPEED_SHOT2_1 + 4, 64, 2);
  187.                     EshotInit (ESHOT_NRG22, p->x + 60 - 8, p->y + 16 - 12, SPEED_SHOT2_1 + 8, 64, 2);
  188.                     EshotInit (ESHOT_NRG22, p->x + 40 - 8, p->y + 16 - 8, SPEED_SHOT2_1 + 4, 64, 2);
  189.                     EshotInit (ESHOT_NRG22, p->x + 20 - 8, p->y + 16 - 4, SPEED_SHOT2_1 + 0, 64, 2);
  190.                     EshotInit (ESHOT_NRG22, p->x + 0 - 8, p->y + 16 + 0, SPEED_SHOT2_1 + 4, 64, 2);
  191.                     EshotInit (ESHOT_NRG22, p->x - 20 - 8, p->y + 16 + 4, SPEED_SHOT2_1 + 8, 64, 2);
  192.                     EshotInit (ESHOT_NRG22, p->x - 40 - 8, p->y + 16 + 8, SPEED_SHOT2_1 + 4, 64, 2);
  193.                 } else {
  194.                     EshotInit (ESHOT_NRG22, p->x - 80 + 8, p->y + 16 - 16, SPEED_SHOT2_1 + 4, 64, 2);
  195.                     EshotInit (ESHOT_NRG22, p->x - 60 + 8, p->y + 16 - 12, SPEED_SHOT2_1 + 8, 64, 2);
  196.                     EshotInit (ESHOT_NRG22, p->x - 40 + 8, p->y + 16 - 8, SPEED_SHOT2_1 + 4, 64, 2);
  197.                     EshotInit (ESHOT_NRG22, p->x - 20 + 8, p->y + 16 - 4, SPEED_SHOT2_1 + 0, 64, 2);
  198.                     EshotInit (ESHOT_NRG22, p->x + 0 + 8, p->y + 16 + 0, SPEED_SHOT2_1 + 4, 64, 2);
  199.                     EshotInit (ESHOT_NRG22, p->x + 20 + 8, p->y + 16 + 4, SPEED_SHOT2_1 + 8, 64, 2);
  200.                     EshotInit (ESHOT_NRG22, p->x + 40 + 8, p->y + 16 + 8, SPEED_SHOT2_1 + 4, 64, 2);
  201.                 }
  202.                 SoundSetSE (SE_ESHOT_M);    /* 敵ショット音(中) */
  203.             }
  204.             break;
  205.         case 8 + INTERVAL2 * 10:
  206.             p->s_work2 = 0;
  207.             break;
  208.         }
  209.         break;
  210.  
  211.     default:
  212.         p->s_work = 0;
  213.         break;
  214.     }
  215.  
  216.  
  217.     /* 自機ショットに当たった時の処理 */
  218.     if (p->damage) {
  219.         SoundSetSE (SE_DAMAGE);
  220.         p->info = PALET_DAMAGE | PRIORITY_BOSS_PARTS + 1;
  221.         p->damage_core = 0;
  222.         if ((p->hp -= p->damage) <= 0) {
  223.             /* 死んだ */
  224.             EffectInit (EFFECT_EXPL, 0, p->x, p->y);
  225.             EffectInit (EFFECT_POINTS_RED, POINTS_7000, p->x, p->y);
  226.             SoundSetSE (SE_EXPL_M);    /* 中ボス爆発音 */
  227.             if (disp_level == DISP_LEVEL_HIGH)
  228.                 EffectInit (EFFECT_HAHENMINI, 0, p->x, p->y);
  229.             p->child_death = !0;    /* 消去準備 */
  230.         }
  231.         p->damage = 0;
  232.         p->flash = TIMER_FLASH_DAMAGE;
  233.     } else {
  234.         if ((p->flash++ > TIMER_FLASH_RED) && (p->hp < 300)) {
  235.             p->info = PALET_RED | PRIORITY_BOSS_PARTS + 1;
  236.             if (p->flash > TIMER_FLASH_NORMAL)
  237.                 p->flash = 0;
  238.         } else {
  239.             p->info = PALET_LBOSS04 | PRIORITY_BOSS_PARTS + 1;
  240.         }
  241.     }
  242.     xobj_set_st (p);
  243.  
  244.  
  245.     return (0);
  246. }
  247.  
  248.  
  249.  
  250. static void EnemyTiniLBoss04W (ENEMY * p)
  251. {
  252. }
  253.